<template>
  <!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
  <!-- #ifdef APP-VUE || MP-WEIXIN || H5 -->
  <view class="uni-swipe">
    <!--  #ifdef MP-WEIXIN || VUE3 -->
    <view class="uni-swipe_box" :change:prop="wxsswipe.showWatch"
          :prop="is_show" :data-threshold="threshold" :data-disabled="disabled" @touchstart="wxsswipe.touchstart"
          @touchmove="wxsswipe.touchmove" @touchend="wxsswipe.touchend">
      <!-- #endif -->
      <!--  #ifndef MP-WEIXIN || VUE3 -->
      <view class="uni-swipe_box" :change:prop="renderswipe.showWatch"
            :prop="is_show" :data-threshold="threshold" :data-disabled="disabled+''"
            @touchstart="renderswipe.touchstart" @touchmove="renderswipe.touchmove" @touchend="renderswipe.touchend">
        <!-- #endif -->
        <!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
        <view class="uni-swipe_button-group button-group--left">
          <slot name="left">
            <view v-for="(item,index) in leftOptions" :key="index" :style="{
					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
                  @touchend="appTouchEnd($event,index,item,'left')" @click.stop="onClickForPC(index,item,'left')">
              <text class="uni-swipe_button-text"
                    :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}
              </text>
            </view>
          </slot>
        </view>
        <view class="uni-swipe_text--center">
          <slot></slot>
        </view>
        <view class="uni-swipe_button-group button-group--right">
          <slot name="right">
            <view v-for="(item,index) in rightOptions" :key="index" :style="{
					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
                  @touchend="appTouchEnd($event,index,item,'right')"
                  @click.stop="onClickForPC(index,item,'right')">
              <text class="uni-swipe_button-text"
                    :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}
              </text>
            </view>
          </slot>
        </view>
      </view>
    </view>
    <!-- #endif -->
    <!-- app nvue端 使用 bindingx -->
    <!-- #ifdef APP-NVUE -->
    <view ref="selector-box--hock" class="uni-swipe" @horizontalpan="touchstart" @touchend="touchend">
      <view ref='selector-left-button--hock' class="uni-swipe_button-group button-group--left">
        <slot name="left">
          <view v-for="(item,index) in leftOptions" :data-button="btn" :key="index" :style="{
				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
				  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'left')">
            <text
                class="uni-swipe_button-text"
                :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}
            </text>
          </view>
        </slot>
      </view>
      <view ref='selector-right-button--hock' class="uni-swipe_button-group button-group--right">
        <slot name="right">
          <view v-for="(item,index) in rightOptions" :data-button="btn" :key="index" :style="{
				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
				  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'right')">
            <text
                class="uni-swipe_button-text"
                :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}
            </text>
          </view>
        </slot>
      </view>
      <view ref='selector-content--hock' class="uni-swipe_box">
        <slot></slot>
      </view>
    </view>
    <!-- #endif -->
    <!-- 其他平台使用 js ，长列表性能可能会有影响-->
    <!-- #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ -->
    <view class="uni-swipe">
      <view class="uni-swipe_box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"
            :style="{transform:moveLeft}" :class="{ani:ani}">
        <view class="uni-swipe_button-group button-group--left" :class="[elClass]">
          <slot name="left">
            <view v-for="(item,index) in leftOptions" :data-button="btn" :key="index" :style="{
					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
                  @touchend="appTouchEnd($event,index,item,'left')">
              <text class="uni-swipe_button-text"
                    :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}
              </text>
            </view>
          </slot>
        </view>
        <slot></slot>
        <view class="uni-swipe_button-group button-group--right" :class="[elClass]">
          <slot name="right">
            <view v-for="(item,index) in rightOptions" :data-button="btn" :key="index" :style="{
					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
					}" @touchstart="appTouchStart" @touchend="appTouchEnd($event,index,item,'right')"
                  class="uni-swipe_button button-hock">
              <text class="uni-swipe_button-text"
                    :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}
              </text>
            </view>
          </slot>
        </view>
      </view>
    </view>
    <!-- #endif -->

</template>
<script src="./wx.wxs" module="wxsswipe" lang="wxs"></script>

<script module="renderswipe" lang="renderjs">
import render from './render.js'
export default {
  mounted(e,ins,owner) {
    this.state = {}
  },
  methods:{
    showWatch(newVal, oldVal, ownerInstance, instance){
      render.showWatch(newVal, oldVal, ownerInstance, instance,this)
    },
    touchstart(e,ownerInstance){
      render.touchstart(e,ownerInstance,this)
    },
    touchmove(e, ownerInstance){
      render.touchmove(e,ownerInstance,this)
    },
    touchend(e,ownerInstance){
      render.touchend(e,ownerInstance,this)
    }
  }
}
</script>
<script>
import mpwxs from './mpwxs'
import bindingx from './bindingx.js'
import mpother from './mpother'

/**
 * SwipeActionItem 滑动操作子组件
 * @description 通过滑动触发选项的容器
 * @tutorial https://ext.dcloud.net.cn/plugin?id=181
 * @property {Boolean} show = [left|right｜none] 	开启关闭组件，auto-close = false 时生效
 * @property {Boolean} disabled = [true|false] 		是否禁止滑动
 * @property {Boolean} autoClose = [true|false] 	滑动打开当前组件，是否关闭其他组件
 * @property {Number}  threshold          滑动缺省值
 * @property {Array} leftOptions          左侧选项内容及样式
 * @property {Array} rgihtOptions          右侧选项内容及样式
 * @event {Function} click              点击选项按钮时触发事件，e = {content,index} ，content（点击内容）、index（下标)
 * @event {Function} change            组件打开或关闭时触发，left\right\none
 */

export default {
  mixins: [mpwxs, bindingx, mpother],
  emits: ['click', 'change'],
  props: {
    // 控制开关
    show: {
      type: String,
      default: 'none'
    },

    // 禁用
    disabled: {
      type: Boolean,
      default: false
    },

    // 是否自动关闭
    autoClose: {
      type: Boolean,
      default: true
    },

    // 滑动缺省距离
    threshold: {
      type: Number,
      default: 20
    },

    // 左侧按钮内容
    leftOptions: {
      type: Array,
      default() {
        return []
      }
    },

    // 右侧按钮内容
    rightOptions: {
      type: Array,
      default() {
        return []
      }
    }

  },
  // #ifndef VUE3
  // TODO vue2
  destroyed() {
    if (this.__isUnmounted) return
    this.uninstall()
  },
  // #endif
  // #ifdef VUE3
  // TODO vue3
  unmounted() {
    this.__isUnmounted = true
    this.uninstall()
  },
  // #endif

  methods: {
    uninstall() {
      if (this.swipeaction) {
        this.swipeaction.children.forEach((item, index) => {
          if (item === this) {
            this.swipeaction.children.splice(index, 1)
          }
        })
      }
    },
    /**
     * 获取父元素实例
     */
    getSwipeAction(name = 'uniSwipeAction') {
      let parent = this.$parent;
      let parentName = parent.$options.name;
      while (parentName !== name) {
        parent = parent.$parent;
        if (!parent) return false;
        parentName = parent.$options.name;
      }
      return parent;
    }
  }
}
</script>
<style lang="scss" scoped>
.uni-swipe {
  position: relative;
  /* #ifndef APP-NVUE */
  overflow: hidden;
  /* #endif */
}

.uni-swipe_box {
  /* #ifndef APP-NVUE */
  display: flex;
  flex-shrink: 0;
  // touch-action: none;
  /* #endif */
  position: relative;
}

.uni-swipe_content {
  // border: 1px red solid;
}

.uni-swipe_text--center {
  width: 100%;
  /* #ifndef APP-NVUE */
  cursor: grab;
  /* #endif */
}

.uni-swipe_button-group {
  /* #ifndef APP-NVUE */
  box-sizing: border-box;
  display: flex;
  /* #endif */
  flex-direction: row;
  position: absolute;
  top: 0;
  bottom: 0;
  /* #ifdef H5 */
  cursor: pointer;
  /* #endif */
}

.button-group--left {
  left: 0;
  transform: translateX(-100%)
}

.button-group--right {
  right: 0;
  transform: translateX(100%)
}

.uni-swipe_button {
  /* #ifdef APP-NVUE */
  flex: 1;
  /* #endif */
  /* #ifndef APP-NVUE */
  display: flex;
  /* #endif */
  flex-direction: row;
  justify-content: center;
  align-items: center;
  padding: 0 20px;
}

.uni-swipe_button-text {
  /* #ifndef APP-NVUE */
  flex-shrink: 0;
  /* #endif */
  font-size: 14px;
}

.ani {
  transition-property: transform;
  transition-duration: 0.3s;
  transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);
}

/* #ifdef MP-ALIPAY */
.movable-area {
  /* width: 100%; */
  height: 45px;
}

.movable-view {
  display: flex;
  /* justify-content: center; */
  position: relative;
  flex: 1;
  height: 45px;
  z-index: 2;
}

.movable-view-button {
  display: flex;
  flex-shrink: 0;
  flex-direction: row;
  height: 100%;
  background: #C0C0C0;
}

/* .transition {
  transition: all 0.3s;
} */

.movable-view-box {
  flex-shrink: 0;
  height: 100%;
  background-color: #fff;
}

/* #endif */
</style>
